<?php
namespace App\Common\Cla\ClaBase\Traits\Common\MagicGather\Get;

use App\Common as com;
use App\Common\Cla\ClaBase\Traits\Common\MagicGather as cla_MagicGather;
use think\facade\App;

/**
 * 属性懒加载（弃用，建议使用Get实现懒加载）
 */
class Lazy extends cla_MagicGather\Base {
	/** 魔术方法事件名称 */
	private $eventSid_Module = 'get_lazy';
	
	private $registerLists = [];
	
	/**
	 *
	 * @param obj $son_class_this MagicGather所在的this
	 */
	public function __construct( $magic_gather_this ){
		parent::__construct( $magic_gather_this );
		// 注册魔术方法get回调
		$this->magicGatherApi->registerMagicEvent( 'get', $this->eventSid_Module, function( $name ){
			return $this->eventCallback( $name );
		} );
	}
	
	/**
	 * 魔术事件回调
	 * @param str $property_name 属性名
	 * @return mixed|com\Lib\Com\Code::$varCustomNull 返回数据 [{mixed}]处理成功，并返回数据 [{com\Lib\Com\Code::$varCustomNull}]处理失败
	 */
	private function eventCallback( $property_name ){
		if( ! isset( $this->registerLists[ $property_name ] ) ) return com\Lib\Com\Code::$varCustomNull;
		//
		$register_callback = &$this->registerLists[ $property_name ]['callback'];
		if( $register_callback instanceof \Closure ){
			// 调用闭包
			$property_value = $register_callback();
		}elseif( $register_callback != '' ){
			// 构建（调用magicGatherThis的getLazyOf{$property_name}()，返回值为属性值）
			if( $this->magicGatherApi->methodExists( $register_callback ) ){
				$property_value = $this->magicGatherApi->methodCall( $register_callback );
			}
		}elseif( $register_callback == null){
			// 构建（调用magicGatherThis的getLazyOfClientObj()，返回值为属性值）
			$callback_str = 'getLazyOf' . com\Lib\Fun\Str::parseName( $property_name, 1, true );
			if( $this->magicGatherApi->methodExists( $callback_str ) ){
				$property_value = $this->magicGatherApi->methodCall( $callback_str );
			}
		}
		// 返回值
		if( isset( $property_value ) ){
			// 属性写到目标类
			return $this->magicGatherThis->$property_name = $property_value;
		}
		//
		return com\Lib\Com\Code::$varCustomNull;
	}
	
	/**
	 * 注册懒加载属性
	 * @param str|array $name 属性名(支持注册多个)。[{str}]单个注册 [{array}]多个注册（此时$callback参数无效）
	 * @param \Closure $callback 加载回调
	 * @return int 是否注册成功。[0]注册失败 [1]注册成功
	 */
	public function register( $name, $callback = null ){
		if( is_array( $name ) ){
			// 多个注册
			foreach( $name as $value ){
				$this->registerLists[ $value ] = [
					'callback' => null
				];
			}
		}else{
			// 单个注册
			$this->registerLists[ $name ] = [
				'callback' => $callback
			];
		}

		//
		return 1;
	}
	
}
